package com.ioc.proxy;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.Date;

/**
 * cglib，是为了解决类没有实现接口，jdk动态代理无法生成代理类的问题
 * 什么是cglib？
 * cglib是一个开源项目，是一个高性能的高质量的code生成库，使用cglib需要导入jar包，但是spring-core包中已经包含了cglib的包
 */
public class CglibDynamicProxy {

    private Object target;

    public CglibDynamicProxy() {
    }

    public CglibDynamicProxy(Object target) {
        this.target = target;
    }

    public void before(){
        System.out.println("执行前:"+new Date().toLocaleString());
    }

    public void after(){
        System.out.println("执行后："+new Date().toString());
    }

    //生成代理对象
    public Object getProxyObject(){
        //1 创建cglib代理对象生成器
        Enhancer enhancer = new Enhancer();
        //2 设置目标对象
        enhancer.setSuperclass(target.getClass());
        //3 设置回调方法：增强的方法
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                before();
                //调用目标方法
                Object invoke = method.invoke(target, args);
                after();
                return invoke;
            }
        });

        //4 创建代理对象并返回
        return enhancer.create();
    }




}
